package Model;

import Model.Interface.CollectionRequest;
import Model.Interface.ListInterface;
import java.util.HashMap;
import java.util.Iterator;
import messages.FileRequest;


/**
 * 
 * La classe ListUser represente le listes des demandes de transfert de fichiers
 * des utilisateurs distants connectés
 * A chaque utilisateur connecté on associe un couple <tt>Nom,FileRequest</tt>
 * 
 * @author      Frank Djomo
 * @author      Christelle SIAGO HAPPI
 * @author      djomopoueme@gmail.com
 * @author      christelle.siagohappi@gmail.com
 * @version     1.0
 */

public class ListRequest implements ListInterface,CollectionRequest{

    private HashMap<String,FileRequest> hashTable ;

    /**
    * Crée la collection des demandes de transferts des utilisateurs distants
    */
    public ListRequest()
    {
        hashTable= new HashMap<String,FileRequest>() ;
    }      
    /**
    * Ajoute un FileRequest  à la collection
    * @param login          Login de l'utilisateur distant à ajouter
    * @param filerequest    FileRequest associé à l'utilisateur distant 
    */
    @Override
    public void addElement(String login,Object filerequest){
         if(!containsName(login))
            hashTable.put(login,(FileRequest)filerequest);     
    }
    /**
    * Crée un nouveau FileRequest pour une nouvelle demande de transfert
    * @param login          Login de l'utilisateur distant connecté
    * @param filerequest    FileRequest associé à l'utilisateur distant      
    */
    @Override
    public void newElement(String login,Object filerequest) {
        addElement(login,(FileRequest)filerequest);
    }
    /**
    * Supprime une demande de transfert de la collection
    * @param login login de l'utilisateur distant à supprimer
    */
    @Override
    public void removeElement(String login){
        if(containsName(login))
            hashTable.remove(login);
    }
    /**
    * Supprime tous les demandes de la collection
    */
    @Override
    public void removeAll() {   
        hashTable.clear();
    }  
    /**
    * Retourne le login d'un utilisateur distant à partir de sa requete de transfert
    * @see FileRequest
    * @param req FileRequest de l'utilisateur distant.
    * @return Login de l'utilisateur distant qui correspond à l'adresse IP
    */
    @Override
    public String getUsernameByRequest(FileRequest req) {
        boolean bFind = false;
        Iterator it = this.iterator();
        String username=null;

        if(!containsRequest(req))
                return username;

        while(it.hasNext() && !bFind) {
            username = (String)it.next();
            if(hashTable.get(username).equals(req)){
                    bFind= true;
            }			
        }
        return username;
    }
    /**
    * Retourne le FileRequest d'un utilisateur distant à partir de son login
    * @see FileRequest
    * @param login Nom de l'utilisateur distant dont on cherche l'adresse IP
    * @return FileRequest de l'utilisateur qui correspond au login
    */
    @Override
    public FileRequest getRequestByName(String login) {
        return hashTable.get(login);
    }
    /**
    * Test si le login recherché fait partie de la liste
    * @param login Login de l'utilisateur recherché
    * @return  Résultat de la recherche   
    *          <code>true</code> si login existe
    *          <code>false</code> sinon
    */
    @Override
    public boolean containsName(String login){
        return (hashTable.containsKey(login)) ;
    }
    /**
    * Test si le FileRequest recherché fait partie de la liste
    * @param request FileRequest de l'utilisateur recherché
    * @return  Résultat de la recherche  
    *          <code>true</code> si request existe
    *          <code>false</code> sinon
    */
    @Override
    public boolean containsRequest(FileRequest request){
        return (hashTable.containsValue(request)) ;
    }
    /**
    * Retourne un iterateur
    * @return Iterateur sur la collection
    */
    @Override
    public Iterator iterator() {
        Iterator<String> it = hashTable.keySet().iterator();
        return it;
    } 
}
